package ar.com.arkios.kfcon4d.dao;

import ar.com.arkios.j4d.opConstants;
import ar.com.arkios.j4d.opException;
import ar.com.arkios.j4d.opProcess;
import ar.com.arkios.j4d.opServerProcess;
import ar.com.arkios.j4d.opServerProcessArray;
import ar.com.arkios.j4d.opVariable;
import ar.com.arkios.kfcon4d.Connection4D;
import ar.com.arkios.kfcon4d.util.CuatroDUtils;
import ar.com.arkios.kfconmodelo.modelo.Pallet;
import java.util.ArrayList;
import java.util.GregorianCalendar;
import java.util.List;
import org.apache.log4j.Logger;

public class PalletDAO {
    
    private static final Logger miLogger = Logger.getLogger(PalletDAO.class);
    
    /** Conección a 4D */
    private Connection4D miConexion;
    
    /** 
     * Proceso a través del cual se ejecutan las consultas a la base de datos 
     * de 4D.
     */
    private opProcess miProceso;
    private opServerProcess miStoreProc;

    public PalletDAO() {
        miConexion = Connection4D.getInstance();
        miProceso = miConexion.getMyProcess();
        try {
            opServerProcessArray losProc = miProceso.GetProcessList();
            for (opServerProcess proc : losProc.mServerProcessArray) {
                if (proc.mProcessName.equals("ExpoStoredProc")) {
                    miProceso.GetProcessNumber(proc);
                    miStoreProc = proc;
                    break;
                }
            }
        } catch (opException ex) {
            miLogger.error("No se pudo establecer conexión a StoredProcedure: "+ex.GetErrorMsg());
        }
    }

    public PalletDAO(opServerProcess miStoreProc) {
        miConexion = Connection4D.getInstance();
        miProceso = miConexion.getMyProcess();
        this.miStoreProc = miStoreProc;
    }
    
    public List<Pallet> getPallet () throws opException {
        List<Pallet> znotif = null;
        
        String centro = CuatroDUtils.GetStringVar(miProceso, "ZN_Centro", opConstants.VPROCESS, miStoreProc);
        String activo = CuatroDUtils.GetStringVar(miProceso, "ZN_Activo", opConstants.VPROCESS, miStoreProc);

        opVariable miVar = new opVariable(opConstants.VPROCESS, "ZN_sALMA");
        String[] almacen = miProceso.GetProcessArrayString(miStoreProc, miVar);

        miVar.mVariableName = "ZN_sLOTEM";
        String[] lotem = miProceso.GetProcessArrayString(miStoreProc, miVar);

        miVar.mVariableName = "ZN_dFecha";
        GregorianCalendar[] fecha = miProceso.GetProcessArrayDate(miStoreProc, miVar);

        miVar.mVariableName = "ZN_sEMBA";
        String[] embalaje = miProceso.GetProcessArrayString(miStoreProc, miVar);

        miVar.mVariableName = "ZN_rPESOR";
        double[] pesor = miProceso.GetProcessArrayReal(miStoreProc, miVar);

        miVar.mVariableName = "ZN_rPESOS";
        double[] pesos = miProceso.GetProcessArrayReal(miStoreProc, miVar);

        miVar.mVariableName = "ZN_sORDEC";
        String[] opcaja = miProceso.GetProcessArrayString(miStoreProc, miVar);

        miVar.mVariableName = "ZN_sORDEP";
        String[] oppallet = miProceso.GetProcessArrayString(miStoreProc, miVar);

        miVar.mVariableName = "ZN_sCALIB";
        String[] calibre = miProceso.GetProcessArrayString(miStoreProc, miVar);

        miVar.mVariableName = "ZN_sCONTR";
        String[] contramarca = miProceso.GetProcessArrayString(miStoreProc, miVar);

        miVar.mVariableName = "ZN_sATMO";
        String[] atmosfera = miProceso.GetProcessArrayString(miStoreProc, miVar);

        miVar.mVariableName = "ZN_sLOTEP";
        String[] lotePallet = miProceso.GetProcessArrayString(miStoreProc, miVar);

        miVar.mVariableName = "ZN_sLOTEC";
        String[] loteCaja = miProceso.GetProcessArrayString(miStoreProc, miVar);

        miVar.mVariableName = "ZN_sIDCOM_PAL";
        String[] idComPal = miProceso.GetProcessArrayString(miStoreProc, miVar);

        miVar.mVariableName = "ZN_sIDCOM_CAJ";
        String[] idComCaja = miProceso.GetProcessArrayString(miStoreProc, miVar);

        miVar.mVariableName = "ZN_sESTADOEX";
        String[] estado = miProceso.GetProcessArrayString(miStoreProc, miVar);

        miVar.mVariableName = "ZN_lCANTI";
        int[] cantidad = miProceso.GetProcessArrayInt(miStoreProc, miVar);

        miVar.mVariableName = "ZN_sSENASA";
        String[] senasa = miProceso.GetProcessArrayString(miStoreProc, miVar);

        miVar.mVariableName = "ZN_sZUMI";
        String[] umi = miProceso.GetProcessArrayString(miStoreProc, miVar);

        miVar.mVariableName = "ZN_sPOSID";
        String[] posId = miProceso.GetProcessArrayString(miStoreProc, miVar);

        miVar.mVariableName = "ZN_sEUREGAP";
        String[] euregap = miProceso.GetProcessArrayString(miStoreProc, miVar);

        miVar.mVariableName = "ZN_sZCALIBRADORA";
        String[] calibradora = miProceso.GetProcessArrayString(miStoreProc, miVar);
      
        znotif = new ArrayList<Pallet>(posId.length);
        for (int i = 0; i < posId.length; i++) {
            Pallet p = new Pallet();
            p.setMiCentroCod(centro);
            p.setMiAlmacenCod(almacen[i]);
            p.setMiLoteMonte(lotem[i]);
            p.setMiFechaYHoraEmbalado(fecha[i].getTime());
            p.setMiEmbalaje(embalaje[i]);
            p.setMiPesoEstandar(pesor[i]);
            p.setMiPesoPallet(pesos[i]);
            p.setMiOrdenCajasCod(opcaja[i]);
            p.setMiOrdenPalletCod(oppallet[i]);
            p.setMiCalibreCod(calibre[i]);
            p.setEstaEncerrado("NE");
            p.setMiContramarca(contramarca[i]);
            p.setAtmosferaControlada(atmosfera[i]);
            p.setMiNumeroLotePallet(lotePallet[i]);
            p.setMiNumeroLoteCaja(loteCaja[i]);
            p.setMiIdComercialCaja(idComCaja[i]);
            p.setMiIdComercialPallet(idComPal[i]);
            p.setMiEstado(estado[i].charAt(0));
            p.setMiCantidadUnidadMedida(cantidad[i]);
            p.setMiSenasaCod(senasa[i]);
            p.setMiUmi(umi[i]);
            p.setMiPosId(posId[i]);
            p.setMiEurepGapCod(euregap[i]);
            p.setMiCalibradoraNombre(calibradora[i]);
            p.setMiIndicadorSeleccion(activo.charAt(0));
            
            znotif.add(p);
        }
       
        return znotif;        
    }

}